package com.example.java8.feature_05.contact_difference;

public class TestLambdaAndInner {
	
	private int age = 12;
	private static String name = "deleerhai";

	/**
	 * 使用Lambda表达式创建对象
	 * */
	public void test(){
		
		String book = "撸呀撸呀撸呀撸呀撸!";
		Displayable dis = () -> {
			//访问effectively final的局部变量
			System.out.println("book局部变量是:" + book);
			//访问外部类的实例变量和类变量
			System.out.println("外部类的age实例变量是:" + age);
			System.out.println("外部类的name类变量为:" + name);
			/*
			 * Lambda表达式不允许在实现方法体中调用接口中的默认方法、
			 * 如下代码将编译出错
			 * */
			//add(5, 6);
		};
		dis.display();
		//调用dis对象从接口中继承的add()默认方法
		System.out.println(dis.add(12, 23));
		/**
		 * 上面代码Lambda表达式与匿名内部类相似的是，由于Lambda表达式访问了book局部变量
		 * 因此该局部变量相当于有一个隐式的final修饰，因此同样不允许对book局部变量重新赋值
		 * */
	}
	
	/**
	 * 使用匿名内部类创建对象
	 * */
	public void test2(){
		
		String book = "撸呀撸呀撸呀撸呀撸!";
		
		Displayable dis = new Displayable() {
			@Override
			public void display() {
				//访问effectively final的局部变量
				System.out.println("book局部变量是:" + book);
				//访问外部类的实例变量和类变量
				System.out.println("外部类的age实例变量是:" + age);
				System.out.println("外部类的name类变量为:" + name);
				/*
				 * 匿名内部类实现方法体中允许调用接口的默认方法
				 * */
				System.out.println(add(8, 6));
			}
		};
	}
	
	public static void main(String[] args) {
		
		new TestLambdaAndInner().test();
		
	}

}
